home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 132_01 / cb.c < prev    next >
Text File  |  1985-08-19  |  4KB  |  271 lines

  1. /*    CB.C small c compiler section    */
  2. /*    This section is preceeded by CA.C and followed by CD.C    */
  3. /* */
  4. #INCLUDE CDEF.H
  5. /*    Start of cc4    */
  6. /*     >>>>>>>>>>>>>><<<<<<<<<<<<<<<<<< */
  7. keepch(c)
  8.     char c;
  9. {    mline[mptr]=c;
  10.     if(mptr<mpmax) mptr++;
  11.     return c;
  12. }
  13. preprocess()
  14. {
  15.     int k;
  16.     char c,sname[namesize];
  17.     if(cmode==0)return;
  18.     mptr=lptr=0;
  19.     while(ch())
  20.         {
  21.         if((ch()==' ') || (ch()==9))
  22.             {
  23.             keepch(' ');
  24.             while((ch()==' ')||(ch()==9))
  25.                 gch();
  26.             }
  27.         else if (ch()=='"')
  28.             {
  29.             keepch(ch());
  30.             gch();
  31.             while(ch()!='"')
  32.                 {if(ch()==0)
  33.                     {error("missing quote");
  34.                 break;
  35.                 }
  36.             keepch(gch());
  37.             }
  38.         gch();
  39.         keepch('"');
  40.         }
  41.     else if (ch()==39)
  42.             {
  43.         keepch(39);
  44.         gch();
  45.         while(ch()!=39)
  46.             {if(ch()==0)
  47.                 {error("missing apostrophe");
  48.                 break;
  49.                 }
  50.             keepch(gch());
  51.             }
  52.         gch();
  53.         keepch(39);
  54.         }
  55.     else if ((ch()=='/')&&(nch()=='*'))
  56.             {
  57.         while(!((ch()=='*')&&(nch()=='/')))
  58.             {if(ch()==0)inline();
  59.                 else inchar();
  60.             if (eof) break;
  61.             }
  62.         inchar (); inchar();
  63.         }
  64.     else if(an(ch()))
  65.             {
  66.         k=0;
  67.         while(an(ch()))
  68.             {if(k<namemax)sname[k++]=ch();
  69.             gch();
  70.             }
  71.         sname[k]=0;
  72.         if(k=findmac(sname))
  73.             while(c=macq[k++])
  74.                 keepch(c);
  75.         else
  76.             {k=0;
  77.             while (c=sname[k++])
  78.                 keepch(c);
  79.             }
  80.         }
  81.         else {
  82.                 keepch(gch());
  83.             }
  84.     }
  85.     keepch(0);
  86.     if(mptr>=mpmax)error("line too long");
  87.     lptr=mptr=0;
  88.     while(line[lptr++]=mline[mptr++]);
  89.     lptr=0;
  90.     }
  91. addmac()
  92. {    char sname[namesize];
  93.     int k;
  94.     if(symname(sname)==0)
  95.         {illname();
  96.         kill();
  97.         return;
  98.         }
  99.     k=0;
  100.     while(putmac(sname[k++]));
  101.     while((ch()==' ') || (ch()==9)) gch();
  102.     while(putmac(gch()));
  103.     if(macptr>=macmax)error("macro table full");
  104.     }
  105. putmac(c)
  106.     char c;
  107. {
  108.     macq[macptr]=c;
  109.     if(macptr<macmax)macptr++;
  110.     return c;
  111. }
  112. findmac(sname)
  113.     char *sname;
  114. {    
  115.     int k;
  116.     k=0;
  117.     while(k<macptr)
  118.         {if(astreq(sname,macq+k,namemax))
  119.             {while(macq[k++]);
  120.             return k;
  121.             }
  122.         while(macq[k++]);
  123.         while(macq[k++]);
  124.         }
  125.     return 0;
  126. }
  127. outbyte(c)
  128.     char c;
  129. {
  130.     if(c==0) return 0;
  131.     if(output)
  132.         {if((putc(c,iobuf0))==EOF)
  133.             {closeout();
  134.             error("output file error");
  135.             }
  136.         }
  137.     else putchar(c);
  138.     return c;
  139. }
  140. outstr(ptr)
  141.     char ptr[];
  142. {
  143.     int k;
  144.     k=0;
  145.     while (outbyte(ptr[k++]));
  146. }
  147. nl()
  148. {    outbyte(eol);outbyte(lf);}
  149. tab()
  150. {    outbyte(9);}
  151. col()
  152. {    outbyte(58);}
  153. error(ptr)
  154.     char ptr[];
  155. {
  156.     int k;
  157.     comment();outstr(line);nl();comment();
  158.     printf("#error line ... %s\n",line);
  159.     k=0;
  160.     while(k<lptr)
  161.         {if(line[k]==9) tab();
  162.             else outbyte(' ');
  163.         ++k;
  164.         }
  165.     outbyte('^');
  166.     nl();comment();outstr("***** ");
  167.     outstr(ptr);
  168.     outstr(" *****");
  169.     nl();
  170.     ++errcnt;
  171. }
  172. ol(ptr)
  173.     char ptr[];
  174. {    ot(ptr);
  175.     nl();
  176. }
  177. ot(ptr)
  178.     char ptr[];
  179. {
  180.     tab();
  181.     outstr(ptr);
  182. }
  183. streq(str1,str2)
  184.     char str1[],str2[];
  185. {
  186.     int k;
  187.     k=0;
  188.     while (str2[k])
  189.         {if((str1[k])!=(str2[k])) return 0;
  190.         k++;
  191.         }
  192.     return k;
  193. }
  194. astreq(str1,str2,len)
  195.     char str1[],str2[];
  196.     int len;
  197. {
  198.     int k;
  199.     k=0;
  200.     while(k<len)
  201.         {if((str1[k])!=(str2[k])) break;
  202.         if(str1[k]==0)break;
  203.         if(str2[k]==0)break;
  204.         k++;
  205.         }
  206.     if (an(str1[k])) return 0;
  207.     if (an(str2[k])) return 0;
  208.     return k;
  209. }
  210. match(lit)
  211.     char *lit;
  212. {
  213.     int k;
  214.     blanks();
  215.     if (k=streq(line+lptr,lit))
  216.         {lptr=lptr+k;
  217.         return 1;
  218.         }
  219.     return 0;
  220. }
  221. amatch(lit,len)
  222.     char *lit;
  223.     int len;
  224. {
  225.     int k;
  226.     blanks();
  227.     if (k=astreq(line+lptr,lit,len))
  228.         {lptr=lptr+k;
  229.         while(an(ch())) inbyte();
  230.         return 1;
  231.         }
  232.     return 0;
  233. }
  234. blanks()
  235. {
  236.     while(1)
  237.         {while(ch()==0)
  238.             {inline();
  239.             preprocess();
  240.             if(eof) break;
  241.             }
  242.         if(ch()==' ')gch();
  243.         else if(ch()==9)gch();
  244.         else return;
  245.         }
  246. }
  247. outdec(number)
  248.     int number;
  249. {
  250.     int k,zs;
  251.     char c;
  252.     zs=0;
  253.     k=10000;
  254.     if(number<0)
  255.         {number=-(number);
  256.         outbyte('-');
  257.         }
  258.     while (k>=1)
  259.         {c=(number/k) + '0';
  260.         if((c!='0')||(k==1)||(zs))
  261.             {zs=1,outbyte(c);}
  262.         number=number%k;
  263.         k=k/10;
  264.         }
  265. }
  266. ;
  267.         }
  268. }
  269. ;
  270.         k=k/10;
  271.